[Talend]tMysqlOutputとtMysqlBulkExecで処理時間がどれくらい違うのか?を検証
はじめに
最近Talendにこなれてきたせいなのか、なんだかTalendが好きになってきたんじゃないかと思える今日この頃ですw と前置きはこれくらいにしておいて、tMysqlOutputとtMysqlBulkExecの処理スピードってどれくらい違うのかな?とふと思ったのでTalendでジョブ作って測定してみました。 動作させた環境は以下です。
- MacOS X 10.10.5
- メモリ 16GB
- Talend Open Studio for Data Integration 6.0.1
- MySQL 5.5 (VMWare Fusion上のWindwos7で動作)
検証用のジョブを作る
ジョブの流れは以下の感じでサクッと作成。
- テストデータを作成(50万件分)してローカルにCSVとして書き出す
- ローカルに書き出したCSVを読み込んでtMap→tMysqlOutputでデータを登録
- シェルでテストデータ50万件にIDを再割り当てして更に50万件のテストデータをCSVに書き出す
- tMysqlBulkExecを使って追加の50万レコードをDBへデータ登録
1.テストデータを作成(50万件分)してローカルにCSVとして書き出す
サブジョブとしてはtRowGeneratorとtFileOutputDelimitedで作れます。 tRowGeneratorコンポーネントを使って50万レコードのテストデータを作成します。 あとはtRowGeneratorコンポーネントをメインでtFileOutputDelimitedでつなぎ保存するCSVファイル名を指定するだけです。
2.ローカルに書き出したCSVを読み込んでtMap→tMysqlOutputでデータを登録
tFileInputDelimitedでは1で作った50万件のテストデータを読み込んでtMapに渡してtMysqlOutputでDBに登録します。 今回はtMysqlOutputのデフォルト値設定を使用します。(100レコード単位でデータを登録し、10000レコード単位でコミットする設定をそのまま利用しています。)
あとは処理開始時刻と処理終了時刻を最初と最後にtJavaコンポーネントを配置してタイムスタンプを標準出力に出します。
3.シェルを使って更に50万件のテストデータを別のCSVに書き出す
tSystemコンポーネントを使ってシェルコマンドを呼び出します。tRowGeneratorで作成した50万件のテストデータ内のIDに対して500001〜1000000までのIDを再割り当てして別の50万件のテストデータを作成します。 シェルといっても単にawk使ってるだけですが・・・ 下記がそのシェルの中身です。
#!/bin/sh cat /Users/IF_FOLDER/outputcsv/generate.csv | awk -F',' '{print 500000 + $1","$2","$3","$4 }' > /Users/IF_FOLDER/outputcsv/generate_bulk.csv
このシェルをgene.shとして保存しているので、tSystemコンポーネントに指定します。
4.tMysqlBulkExecを使って追加の50万レコードをDBへデータ登録
サブジョブとして以下の感じで作りました。 単にtSystemコンポーネントでキックしたシェルで作成されたテストデータCSVをtMysqlBulkExecのインプットデータとして指定しただけです。下記はシェルで書き出されたCSVの一部
500001,Chester,Monroe,42 500002,Chester,Jackson,57 500003,William,Jefferson,4 500004,Rutherford,Roosevelt,16 500005,Bill,Eisenhower,5 500006,James,Johnson,45 500007,Ulysses,Van Buren,84 500008,Benjamin,Quincy,37 500009,Herbert,Ford,23 500010,John,Taylor,78 500011,Ronald,Reagan,92 500012,Franklin,Monroe,33 500013,Millard,Truman,35 500014,Abraham,Jefferson,69 500015,George,Garfield,49 500016,George,Taylor,100 500017,Martin,Roosevelt,91 500018,Gerald,Quincy,100 500019,Warren,Fillmore,36 500020,John,Kennedy,54
処理開始時刻と処理終了時刻をtMysqlBulkExecコンポーネントの前と後ろにtJavaコンポーネントを配置してタイムスタンプを標準出力に出します。
実際にジョブ実行してみる
50万件(tMysqlOutput)+50万件(tMysqlBulkExec)の処理時間は以下になりました。
tMysqlOutputで50万レコードのインサート所要時間:約7秒 tMysqlBulkExecで50万レコードのインサート所要時間:約2秒
約5秒tMysqlBulkExecの方が早いことが確認できました。
あとは10万件、20万件、30万件、40万件もテスト的に実行してみた結果も参考までに載せておきます。
10万レコード ジョブ CMBlog_8 を 13:43 15/12/2015 に開始しました。 [statistics] connecting to socket on port 3897 [statistics] connected [2015-12-15 13:43:06]Insert Start. [2015-12-15 13:43:08]Insert End. [2015-12-15 13:43:09]Bulk Insert Start. [2015-12-15 13:43:09]Bulk Insert End. [statistics] disconnected ジョブ CMBlog_8 が 13:43 15/12/2015 に終了しました。 [終了コード=0] 20万レコード ジョブ CMBlog_8 を 13:41 15/12/2015 に開始しました。 [statistics] connecting to socket on port 3612 [statistics] connected [2015-12-15 13:41:38]Insert Start. [2015-12-15 13:41:42]Insert End. [2015-12-15 13:41:43]Bulk Insert Start. [2015-12-15 13:41:43]Bulk Insert End. [statistics] disconnected ジョブ CMBlog_8 が 13:41 15/12/2015 に終了しました。 [終了コード=0] 30万レコード ジョブ CMBlog_8 を 13:43 15/12/2015 に開始しました。 [statistics] connecting to socket on port 3793 [statistics] connected [2015-12-15 13:43:59]Insert Start. [2015-12-15 13:44:04]Insert End. [2015-12-15 13:44:05]Bulk Insert Start. [2015-12-15 13:44:06]Bulk Insert End. [statistics] disconnected ジョブ CMBlog_8 が 13:44 15/12/2015 に終了しました。 [終了コード=0] 40万レコード ジョブ CMBlog_8 を 13:45 15/12/2015 に開始しました。 [statistics] connecting to socket on port 3506 [statistics] connected [2015-12-15 13:45:44]Insert Start. [2015-12-15 13:45:49]Insert End. [2015-12-15 13:45:50]Bulk Insert Start. [2015-12-15 13:45:52]Bulk Insert End. [statistics] disconnected ジョブ CMBlog_8 が 13:45 15/12/2015 に終了しました。 [終了コード=0]
まとめ
こういうプログラムをjavaで書くとそれなりに時間がかかってしまいますが、Talendを使うと簡単に実現できてしまうので、慣れてくると病み付きになりますねw 次はRedshiftに対してはどれくらいの差が出てくるのかを検証してみたいとおもいます。